/**
 * @(#)BundleTraducido.java 7/06/2010
 *
 * Copyright (c) 2007-2012 PsiqueWare S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information PsiqueWare S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: 7/06/2010 - 09:43:05 PM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>7/06/2010 | <a href = "mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.i18n.traductor;

import java.io.File;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Map;
import java.util.ResourceBundle;

/**
 * {@link ResourceBundle} con una traduccion.
 * <br/>Paquete Original: com.psiqueware.alheli.i18n.traductor
 * <br/>Nombre  Original: BundleTraducido
 * <br/>Oprima para ver : <a href="BundleTraducido.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">AngelElectrico</a>
 * @version Revision: 1.1 7/06/2010 09:43:05 PM
 */
public final class BundleTraducido extends ResourceBundle
{

    /**
     * Mapa de llaves>valor con el origen a traducir.
     */
    private final Map<String, String> m_origen;

    /**
     * Mapa de llaves>valor con la traducci&oacute;n del origen.
     */
    private final Map<String, String> m_traduccion;

    /**
     * {@link File} que apunta al archivo de la traducci&oacute;n.
     */
    private final File m_archivoTraduccion;

    /**
     * {@link Enumeration} con las llaves del {@link ResourceBundle}.
     */
    private Enumeration<String> m_llavesEnum;


    /**
     * Constructor de BundleTraducido.
     *
     * @param origen            Mapa de llaves>valor con el origen a traducir.
     * @param traduccion        Mapa de llaves>valor con la traducci&oacute;n del origen.
     * @param archivoTraduccion {@link File} que apunta al archivo de la traducci&oacute;n.
     */
    public BundleTraducido(final Map<String, String> origen, final Map<String, String> traduccion, final File archivoTraduccion)
    {
        m_origen = origen;
        m_traduccion = traduccion;
        m_archivoTraduccion = archivoTraduccion;
        m_llavesEnum = Collections.enumeration(m_origen.keySet());
    }

    /**
     * Gets an object for the given key from this resource bundle.
     * Returns null if this resource bundle does not contain an
     * object for the given key.
     *
     * @param key the key for the desired object
     *
     * @return the object for the given key, or null
     *
     * @throws NullPointerException if <code>key</code> is <code>null</code>
     * @noinspection ResultOfMethodCallIgnored
     */
    @Override
    protected Object handleGetObject(final String key)
    {
        String traducido = m_traduccion.get(key);

        //Si no se encontr&oacute; la traducci&oacute;n devolvemos el texto sin traducir pero eliminamos el archivo con las traducciones.
        if (null == traducido)
        {
            try
            {
                final String sinTraducir = m_origen.get(key);
                if (null != sinTraducir)
                {
                    if (m_archivoTraduccion.exists()) m_archivoTraduccion.delete();
                    traducido = sinTraducir;
                }
            }
            catch (final Exception ignored)
            {}
        }
        return traducido;
    }

    /**
     * Returns an enumeration of the keys.
     */
    @Override
    public Enumeration<String> getKeys()
    {
        return m_llavesEnum;
    }
}

